
#ifndef _PWM_H_
#define _PWM_H_

#include <stm32f4xx_hal.h>

#define MOTOR_PWM_TIM TIM1

#define MOTOR_TIM_CLK_ENABLE() __HAL_RCC_TIM1_CLK_ENABLE()

#define MOTOR_1_GPIO_CLK_ENABLE() __HAL_RCC_GPIOE_CLK_ENABLE()
#define MOTOR_2_GPIO_CLK_ENABLE() __HAL_RCC_GPIOE_CLK_ENABLE()
#define MOTOR_3_GPIO_CLK_ENABLE() __HAL_RCC_GPIOE_CLK_ENABLE()
#define MOTOR_4_GPIO_CLK_ENABLE() __HAL_RCC_GPIOE_CLK_ENABLE()

#define MOTOR_1_CHANNEL TIM_CHANNEL_1
#define MOTOR_2_CHANNEL TIM_CHANNEL_2
#define MOTOR_3_CHANNEL TIM_CHANNEL_4
#define MOTOR_4_CHANNEL TIM_CHANNEL_3

#define MOTOR1_GPIO_GROUP GPIOE
#define MOTOR2_GPIO_GROUP GPIOE
#define MOTOR3_GPIO_GROUP GPIOE
#define MOTOR4_GPIO_GROUP GPIOE

#define MOTOR1_GPIO_PIN GPIO_PIN_9
#define MOTOR2_GPIO_PIN GPIO_PIN_11
#define MOTOR3_GPIO_PIN GPIO_PIN_14
#define MOTOR4_GPIO_PIN GPIO_PIN_13

#define MOTOR1_GPIO_AF GPIO_AF1_TIM1
#define MOTOR2_GPIO_AF GPIO_AF1_TIM1
#define MOTOR3_GPIO_AF GPIO_AF1_TIM1
#define MOTOR4_GPIO_AF GPIO_AF1_TIM1

#define MOTOR_TIM_PERIOD (1000 - 1)
#define MOTOR_TIM_PRESCALER (168 - 1)

#define MOTOR_PWM_MIN 0       /* PWM占空比最小值0，表示完全停转 */
#define MOTOR_PWM_RUN_MIN 500 /* 电机在运转时高电平周期最小值 */
#define MOTOR_PWM_MAX 4000    /* 电机在运转时高电平周期最大值 */

enum motor_id
{
    motor_1,
    motor_2,
    motor_3,
    motor_4,
};

/// @brief 电机PWM控制前初始化TIM外设，初始化之后占空比为0
/// @param
/// @return
int motor_pwm_init(void);

/// @brief 设置一个电机转速（占空比）
/// @param motor_which 指明是哪一个电机
/// @param duty_cycle 0~1之间表示占空比
/// @return
int motor_run(enum motor_id motor_which, float duty_cycle);
#endif
